﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Collections;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BSC_OTC_Management.BSC_SERVICES;
using System.IO;
using System.Globalization;

namespace BSC_OTC_Management.Forms
{
    public partial class Frm_AddEdit : Form
    {
        #region Khai báo biến
        Code.CL_Ultility _cl = new Code.CL_Ultility();
        Code.ImageCompress _ic = new Code.ImageCompress();
        string _ID = "";
        string _ID_ColumnName = "";
        string _formName = "";
        string _formTitle = "";
        string _function = "";
        string _NameofTable = "";
        int sttPicturebox = 0;
        DataTable _tableControl = new DataTable();
        DataTable _oldtableData = new DataTable("OLDDATA");
        Code.StaticVariable _code = new Code.StaticVariable();
        int _positionX = 150;
        int _positionY = 30;
        List<TextBox> _listTextbox = new List<TextBox>();
        List<TextBox> _listTextbox_Truyvan = new List<TextBox>();
        List<ComboBox> _listCombobox = new List<ComboBox>();
        List<PictureBox> _listPictureBox = new List<PictureBox>();
        List<OpenFileDialog> _listOpenFileDialog = new List<OpenFileDialog>();
        List<DateTimePicker> _listDatetimepicker = new List<DateTimePicker>();
        List<byte[]> _listImage = new List<byte[]>();
        DataTable _tableValue = new DataTable("noname");
        #endregion

        public Frm_AddEdit()
        {
            InitializeComponent();
        }

        public Frm_AddEdit(string formName, string formTitle, string funtion, string _ID, string _ID_ColumnName)
        {
            InitializeComponent();
            this._formTitle = formTitle;
            this._formName = formName;
            this._function = funtion;
            this.Text = _formTitle;
            this._NameofTable = formName;
            this._tableControl = _code._services.GetFldMasterBy_Objname(_formName);
            if (_ID != "")
            {
                this._ID = _ID;
            }
            if (_ID_ColumnName != "")
            {
                this._ID_ColumnName = _ID_ColumnName;
            }
            LoadControls();
        }

        #region Hiển thị control

        private void LoadControls()
        {
            // Load textbox, combobox, datetime từ bảng fldmaster
            foreach (DataRow row in _tableControl.Rows)
            {
                switch (row["fldtype"].ToString())
                {
                    case "T":
                        // neu kieu du lieu la T --> them textbox
                        AddTextbox(row);
                        break;
                    case "C":
                        // neu kieu du lieu la C --> them combobox hoặc textbox tùy vào trường LOOKUP , nếu Y thì là thêm textbox gọi F5 ra màn hình truy vấn
                        // nếu là N thì là combobox lấy từ bảng Allcode
                        if (row["lookup"].ToString() == "Y" && row["lookupname"].ToString() != "")
                        {
                            AddTextbox_TruyVan(row);
                        }
                        else
                        {
                            AddCombobox(row);
                        }
                        break;
                    case "D":
                        AddDatePicker(row);
                        break;
                    case "B":
                        AddOpenfileDialog(row);
                        break;
                    default:
                        break;
                }
            }

            // thêm mới hoặc sửa

            if (this._function != "AddNew")
            {
                ShowData();
            }

            // Set height form
            this.gbTT.Height = this._positionY + 15;
            this.Height = this._positionY + 100;
        }

        private void AddTextbox_TruyVan(DataRow _row)
        {
            #region tạo các thuộc tính của textbox
            TextBox _textbox = new TextBox();
            _textbox.Name = "txt_" + _row["fldname"].ToString();
            _textbox.Width = 250;
            _textbox.Tag = _row["caption"].ToString();
            _textbox.AccessibleDescription = _row["fldname"].ToString();
            _textbox.AccessibleDefaultActionDescription = _row["lookupname"].ToString();
            _textbox.Location = new Point(this._positionX, this._positionY);
            _textbox.BackColor = Color.FromArgb(192, 255, 192);
            _textbox.ReadOnly = true;
            //neu view thi readonly
            if (this._function == Code.StaticVariable.function_View)
                /*ko lam gì*/;
            else
                _textbox.KeyDown += new KeyEventHandler(_textbox_KeyDown);
            gbTT.Controls.Add(_textbox);
            this.AddLabel(_row);
            this._positionY += 25;
            this._listTextbox_Truyvan.Add(_textbox);
            // check xem trường này có bắt buộc phải có giá trị không
            if (_row["mandatory"].ToString().Equals("Y"))
            {
                _textbox.Name += _textbox.Name + "_mandatory";
                _textbox.BackColor = Color.FromArgb(255, 225, 170);
            }

            // check xem trường này có chống trùng giá trị không
            if (_row["defparam"].ToString().Equals("Y"))
            {
                _textbox.Name += _textbox.Name + "_defparam";
            }

            //check xem trường này có disable không
            if (_row["disable"].ToString().Equals("Y"))
            {
                _textbox.Enabled = false;
            }

            //check xem trường này có giá trị default value không
            if (_row["defval"].ToString().Length > 0)
            {
                _textbox.Text = _row["defval"].ToString();
            }

            // nếu trường vừa nhập là số thì format nó cho đẹp
            if (_row["fldmask"].ToString().Length > 0)
                _textbox.Leave += new EventHandler(_textbox_Leave);
            #endregion
        }

        private void AddDatePicker(DataRow _row)
        {
            DateTimePicker _dtp = new DateTimePicker();
            _dtp.Name = "dtp_" + _row["fldname"].ToString();
            _dtp.Width = 250;
            _dtp.Tag = _row["caption"].ToString();
            _dtp.AccessibleDescription = _row["fldname"].ToString();
            _dtp.Location = new Point(this._positionX, this._positionY);
            _dtp.Format = DateTimePickerFormat.Custom;
            _dtp.CustomFormat = " ";
            _dtp.ValueChanged += new EventHandler(this.dateTimePicker_ValueChanged);
            
            gbTT.Controls.Add(_dtp);
            this.AddLabel(_row);
            this._positionY += 25;
            this._listDatetimepicker.Add(_dtp);

            // check xem trường này có bắt buộc phải có giá trị không
            if (_row["mandatory"].ToString().Equals("Y"))
            {
                _dtp.Name = _dtp.Text + "_mandatory";
                _dtp.BackColor = Color.FromArgb(255, 225, 170);
            }

            //check xem trường này có disable không
            if (_row["disable"].ToString().Equals("Y"))
            {
                _dtp.Enabled = false;
            }

            //check xem trường này có giá trị default value không
            if (_row["defval"].ToString().Length > 0)
            {
                _dtp.Text = DateTime.ParseExact(_row["defval"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
            }

            //neu view thi readonly
            if (this._function == Code.StaticVariable.function_View)
                _dtp.Enabled = false;  

        }

        private void AddCombobox(DataRow _row)
        {
            ComboBox _combobox = new ComboBox();
            _combobox.Text = "cbb_" + _row["fldname"].ToString();
            _combobox.Width = 250;
            _combobox.AccessibleDescription = _row["fldname"].ToString();
            _combobox.Location = new Point(this._positionX, this._positionY);
            DataTable _tableAllCode = _code._services.GetDatatable_BySQL(_row["llist"].ToString());
            if (_row["llist"].ToString().Contains("allcode"))
            {
                _combobox.AccessibleName = "";
            }
            else
            {
                _combobox.AccessibleName = _row["llist"].ToString();
            }
            foreach (DataRow rowAllCode in _tableAllCode.Rows)
            {
                _combobox.Items.Add(rowAllCode["display"].ToString());
            }
            _combobox.SelectedIndex = 0;
            _combobox.DropDownStyle = ComboBoxStyle.DropDownList;
            gbTT.Controls.Add(_combobox);
            this.AddLabel(_row);
            this._positionY += 25;
            this._listCombobox.Add(_combobox);

            //neu view thi readonly
            if (this._function == Code.StaticVariable.function_View)
                _combobox.Enabled = false;  
        }

        private void AddOpenfileDialog(DataRow _row)
        {
            #region tạo 1 button
            Button _btn = new Button();
            _btn.Text = "Chọn file ảnh";
            _btn.Width = 150;
            _btn.Tag = _row["caption"].ToString();
            _btn.AccessibleDefaultActionDescription = this.sttPicturebox.ToString();
            _btn.AccessibleDescription = _row["fldname"].ToString();
            _btn.Location = new Point(this._positionX, this._positionY);
            _btn.Click += new EventHandler(_btn_Click);
            //neu view thi readonly
            if (this._function == Code.StaticVariable.function_View)
                _btn.Enabled = false; 
            gbTT.Controls.Add(_btn);
            #endregion

            #region  1 picturebox
            PictureBox _picturebox = new PictureBox();
            _picturebox.AccessibleDefaultActionDescription = this.sttPicturebox.ToString();
            _picturebox.Name = "ptb_" + _row["fldname"].ToString();
            _picturebox.Size = new Size(78, 75);
            _picturebox.Tag = _row["caption"].ToString();
            _picturebox.AccessibleDescription = _row["fldname"].ToString();
            _picturebox.Location = new Point(this._positionX, this._positionY + 25);
            _picturebox.SizeMode = PictureBoxSizeMode.StretchImage;
            _picturebox.BackColor = Color.White;

            gbTT.Controls.Add(_picturebox);
            this.AddLabel(_row);
            this._listPictureBox.Add(_picturebox);
            this._positionY += 105;
            #endregion

            #region tạo 1 open file dialog
            OpenFileDialog _ofd = new OpenFileDialog();
            _ofd.Title = _row["fldname"].ToString();
            this._listOpenFileDialog.Add(_ofd);
            #endregion
            this.sttPicturebox++;
        }

        void _btn_Click(object sender, EventArgs e)
        {
            Button _btn = (Button)sender;
            int stt = Convert.ToInt32(_btn.AccessibleDefaultActionDescription);
            foreach (PictureBox item in this._listPictureBox)
            {
                if (item.AccessibleDefaultActionDescription == stt.ToString())
                {
                    if (this._listOpenFileDialog[stt].ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        item.ImageLocation = this._listOpenFileDialog[stt].FileName;
                        this.imageList1.Images.Add(Image.FromFile(this._listOpenFileDialog[stt].FileName));
                        break;
                    }
                }
            }
        }

        private void AddTextbox(DataRow _row)
        {
            #region tạo các thuộc tính của textbox
            TextBox _textbox = new TextBox();
            _textbox.Name = "txt_" + _row["fldname"].ToString();
            _textbox.Width = 250;
            _textbox.Tag = _row["caption"].ToString();
            _textbox.AccessibleDescription = _row["fldname"].ToString();
            _textbox.AccessibleName = Convert.ToString(_row["fldmask"]); //xem có phải là trường số cần format ko?
            _textbox.Location = new Point(this._positionX, this._positionY);
            gbTT.Controls.Add(_textbox);
            this.AddLabel(_row);
            this._positionY += 25;
            this._listTextbox.Add(_textbox);
            #endregion

            // check xem trường này có bắt buộc phải có giá trị không
            if (_row["mandatory"].ToString().Equals("Y"))
            {
                _textbox.Name += _textbox.Name + "_mandatory";
                _textbox.BackColor = Color.FromArgb(255, 225, 170);
            }

            // check xem trường này có chống trùng giá trị không
            if (_row["defparam"].ToString().Equals("Y"))
            {
                _textbox.Name += _textbox.Name + "_defparam";
            }

            //check xem trường này có disable không
            if (_row["disable"].ToString().Equals("Y"))
            {
                _textbox.Enabled = false;
            }

            //check xem trường này có giá trị default value không
            if (_row["defval"].ToString().Length > 0)
            {
                _textbox.Text = _row["defval"].ToString();
            }

            // nếu trường vừa nhập là số thì format nó cho đẹp
            if (_row["fldmask"].ToString().Length > 0)
                _textbox.Leave += new EventHandler(_textbox_Leave);

            //check xem trường này có multiple line ko?
            if (_row["riskfld"].ToString().Equals("Y"))
            {
                _textbox.Multiline = true;
                _textbox.ScrollBars = ScrollBars.Vertical;
                _textbox.Height = 100;
                this._positionY += 80;
            }

            //neu view thi readonly
            if (this._function == Code.StaticVariable.function_View)
                _textbox.ReadOnly = true;
        }

        private void AddLabel(DataRow _row)
        {
            Label _lbl = new Label();
            _lbl.Name = "lbl_" + _row["fldname"].ToString();
            _lbl.Text = _row["caption"].ToString();
            _lbl.Width = 200;
            _lbl.Location = new Point(this._positionX - 130, this._positionY);
            gbTT.Controls.Add(_lbl);
        }

        #endregion

        #region sự kiện

        // sự kiện F5 cho textbox gọi form truy vấn
        void _textbox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F5)
            {
                TextBox _textbox = sender as TextBox;
                //lấy thông tin truy vấn: tên bảng, title
                string tblname = _textbox.AccessibleDefaultActionDescription.ToString().Split('^')[2];
                DataTable menu = _code._services.GetMenu_ByMenuName(tblname);
                string tbltitle = "";
                if (menu.Rows.Count > 0)
                    tbltitle = menu.Rows[0]["menufullname"].ToString();

                Forms.FrmView _FrmView = new Forms.FrmView(tblname, tbltitle, true);
                _FrmView.ShowDialog();
                if (Code.StaticVariable.DTable.Rows.Count > 0)
                {
                    _textbox.Text = Code.StaticVariable.DTable.Rows[0][_textbox.AccessibleDefaultActionDescription.ToString().Split('^')[1]].ToString();
                    _textbox.Name = Code.StaticVariable.DTable.Rows[0][_textbox.AccessibleDefaultActionDescription.ToString().Split('^')[0]].ToString();
                }
                Code.StaticVariable.DTable.Clear();
            }
        }

        //set giá trị cho textbox truy vấn
        void _textbox_Truyvan_setData(TextBox _textbox, string _data)
        {
            string tblname = _textbox.AccessibleDefaultActionDescription.ToString().Split('^')[2];//tên bảng dl truy vấn
            string colname = _textbox.AccessibleDefaultActionDescription.ToString().Split('^')[1];//tên bảng dl truy vấn
            string colid = _textbox.AccessibleDefaultActionDescription.ToString().Split('^')[0];//tên bảng dl truy vấn
            DataTable dt = new DataTable();
            dt = _code._services.GetDatatable_Where(tblname, colid, _data);

            if (dt.Rows.Count > 0)
            {
                _textbox.Text = dt.Rows[0][colname].ToString();
                _textbox.Name = dt.Rows[0][colid].ToString();
            }
        }


        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                this.Close();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnFunction_Click(object sender, EventArgs e)
        {
            Function_AddEdit();
        }

        // nếu trường vừa nhập là số thì format nó cho đẹp 
        void _textbox_Leave(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)sender;
            if (txt.Text.Length >= 0)
            {
                //format theo dinh dang so 1000 -> 1,000
                txt.Text = this._cl.NumberFormat(txt.Text);
            }
        }

        //sự kiện value changed của dateTimePicker
        void dateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            DateTimePicker dtp = (DateTimePicker)sender;
            dtp.CustomFormat = "dd/MM/yyyy";
        }

        #endregion

        #region xử lý code

        private void Function_AddEdit()
        {
            if (Check_DieuKien())
            {
                //clear old data of table
                this._tableValue = new DataTable("noname");
                // tạo 1 datatable lưu giá trị các textbox, combobox, datetimepicker
                // tạo column trước

                foreach (DataRow _row in this._tableControl.Rows)
                {
                    this._tableValue.Columns.Add(_row["fldname"].ToString());
                }

                // tạo 1 row chứa giá trị bản ghi
                DataRow rowData = _tableValue.NewRow();

                // gán hết giá trị các textbox vào mảng
                foreach (TextBox txt in this._listTextbox)
                {
                    if (_tableValue.Columns.Contains(txt.AccessibleDescription))
                    {
                        if (txt.AccessibleName.Length != 0) //neu là trưòng số thì convert ngược lại
                            rowData[txt.AccessibleDescription] = Convert.ToDouble(txt.Text);
                        else
                            rowData[txt.AccessibleDescription] = txt.Text;
                    }
                }

                // gán hết giá trị các textbox truy van vào mảng
                foreach (TextBox txt in this._listTextbox_Truyvan)
                {
                    if (_tableValue.Columns.Contains(txt.AccessibleDescription))
                    {
                        rowData[txt.AccessibleDescription] = txt.Name;
                    }
                }

                // gán hết giá trị các combobox vào mảng
                foreach (ComboBox cbb in this._listCombobox)
                {
                    if (_tableValue.Columns.Contains(cbb.AccessibleDescription))
                    {
                        // kiểm tra nếu combobox lấy giá trị trong ALLCODE thì lấy luôn text, nêu lấy trong bảng khác thì truy vấn lại
                        if (cbb.AccessibleName.Contains("ALLCODE"))
                        {
                            //rowData[cbb.AccessibleDescription] = cbb.Text;
                            string result = _code._services.GetID_ByCombobox(cbb.AccessibleName, cbb.Text);
                            rowData[cbb.AccessibleDescription] = result;
                        }
                        else
                        {
                            string result = _code._services.GetID_ByCombobox(cbb.AccessibleName, cbb.Text);
                            rowData[cbb.AccessibleDescription] = result;
                        }
                    }
                }

                // gán hết giá trị các datetimepicker vào mảng
                foreach (DateTimePicker dtp in this._listDatetimepicker)
                {
                    if (_tableValue.Columns.Contains(dtp.AccessibleDescription))
                    {
                        //rowData[dtp.AccessibleDescription] = dtp.Value.ToString("dd/MM/yyyy");
                        if (!_cl.CheckDateTime(dtp.Text))
                             rowData[dtp.AccessibleDescription] = null;
                        else
                            rowData[dtp.AccessibleDescription] = DateTime.ParseExact(dtp.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
                    }
                }

                foreach (DataRow row in this._tableControl.Rows)
                {
                    if (row["fldtype"].ToString() == "B")
                    {
                        /*foreach (PictureBox ptb in this._listPictureBox)
                        {
                            if (ptb.Image == null )
                            {
                                continue;
                            }
                            else
                            {
                                if (ptb.AccessibleDescription == Convert.ToString(row["fldname"]))
                                {
                                    //get byte
                                    byte[] imgData = _cl.imageToByteArray(ptb.Image);
                                    //compress image
                                    int i = 100;
                                    int imgLenght = (int)imgData.Length;
                                    while (imgLenght > 300000 && i > 0)
                                    {
                                        i -= 10;
                                        Image originalImage = ptb.Image;
                                        string file_name = Application.StartupPath + "\\__temp.jpg";
                                        _ic.SaveJpg(originalImage, file_name, i);

                                        FileStream imgFileStream = new FileStream(file_name, FileMode.Open, FileAccess.Read);
                                        imgLenght = (int)imgFileStream.Length;
                                        imgData = new byte[imgFileStream.Length];
                                        imgFileStream.Read(imgData, 0, System.Convert.ToInt32(imgFileStream.Length));
                                        imgFileStream.Close();
                                    }
                                    //image to string
                                    //FileStream imgFileStream = new FileStream(file_name, FileMode.Open, FileAccess.Read);
                                    string stringData = Convert.ToBase64String(imgData, Base64FormattingOptions.InsertLineBreaks);
                                    rowData[row["fldname"].ToString()] = stringData;
                                    break;
                                }
                            }
                        }*/
                        foreach (OpenFileDialog ofd in this._listOpenFileDialog)
                        {
                            if (ofd.FileName == "")
                            {
                                continue;
                            }
                            else
                            {
                                if (ofd.Title == Convert.ToString(row["fldname"]))
                                {
                                    //get byte
                                    string file_name = ofd.FileName;
                                    FileStream imgFileStream = new FileStream(file_name, FileMode.Open, FileAccess.Read);
                                    //compress image
                                    int i = 100;
                                    while (imgFileStream.Length > 300000 && i > 0)
                                    {
                                        i -= 10;
                                        imgFileStream.Close();
                                        Image originalImage = _ic.LoadBitmapUnlocked(ofd.FileName);
                                        file_name = Application.StartupPath + "\\__temp.jpg";
                                        _ic.SaveJpg(originalImage, file_name, i);

                                        imgFileStream = new FileStream(file_name, FileMode.Open, FileAccess.Read);
                                    }
                                    //image to string
                                    //FileStream imgFileStream = new FileStream(file_name, FileMode.Open, FileAccess.Read);
                                    int imgLenght = (int)imgFileStream.Length;
                                    byte[] imgData = new byte[imgFileStream.Length];
                                    imgFileStream.Read(imgData, 0, System.Convert.ToInt32(imgFileStream.Length));
                                    imgFileStream.Close();
                                    string stringData = Convert.ToBase64String(imgData, Base64FormattingOptions.InsertLineBreaks);
                                    rowData[row["fldname"].ToString()] = stringData;
                                    break;
                                }
                            }
                        }
                    }
                }

                this._tableValue.Rows.Add(rowData);

                // Tạo xong row chưa dữ liệu, tạo thêm 1 row chứa kiểu dữ liệu
                DataRow rowDataType = _tableValue.NewRow();
                int stt = 0;
                foreach (DataRow _row in this._tableControl.Rows)
                {
                    rowDataType[stt] = _row["fldtype"].ToString();
                    stt++;
                }
                //add data of duyet
                //rowDataType["DUYET"] = "T";
                this._tableValue.Rows.Add(rowDataType);

                //string message box
                string msg = "";
                switch (this._function)
                {
                    case "AddNew":
                        try
                        {   //Checksltraiphieu
                            if (!CheckSLTraiPhieu())
                                throw new Exception(Code.StaticVariable.messeseboxCheckSLTPError);
                            msg = _code._services.AddNewRow_ReturnID(this._formName, this._tableValue);
                            if (_cl.IsNumeric(msg))
                            {
                                int id = Convert.ToInt32(msg);
                                //lưu vết giao dịch
                                _code._services.WritetoTLLOG(Code.StaticVariable.userID,
                                                                "",
                                                                Code.StaticVariable.menu_Code,
                                                                _cl.Current_DATE("dd/MM/yyyy"),
                                                                "",
                                                                _cl.Current_DATE("hh:mm:ss"),
                                                                "",
                                                                (int)Code.StaticVariable.approveCase.ChuaDuyet + "",
                                                                this._function,
                                                                msg,
                                                                DataTableToString(_tableValue));
                                //luu vet nguoi thuc hien
                                _code._services.Update_Last_Change(_formName, msg, Code.StaticVariable.userID);
                                MessageBox.Show(Code.StaticVariable.messeseboxThemmoiThanhCong, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                                this.Close();
                            }
                            else
                                MessageBox.Show(Code.StaticVariable.messeseboxThatBai, Code.StaticVariable.messeseboxLuuY);
                        }
                        catch (Exception ex)
                        {
                            this._tableValue = new DataTable("noname");
                            MessageBox.Show(ex.Message, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                        }
                        break;
                    case "Edit":
                        try
                        {
                            //Checksltraiphieu
                            if (!CheckSLTraiPhieu())
                                throw new Exception(Code.StaticVariable.messeseboxCheckSLTPError);
                            //so sanh du lieu giua 2 bang xem co sua ko?
                            if (!Compare2Table(_oldtableData, _tableValue)) //có sửa dl
                            {
                                msg = _code._services.WriteToMaintain_log(this._formName, this._tableValue, this._oldtableData, this._ID_ColumnName, this._ID, Code.StaticVariable.userID);
                                bool b = _code._services.Approve_Data(this._formName, this._ID_ColumnName, this._ID, (int)Code.StaticVariable.approveCase.ChuaDuyet);
                                _code._services.WritetoTLLOG(Code.StaticVariable.userID,
                                                               "",
                                                               Code.StaticVariable.menu_Code,
                                                               _cl.Current_DATE("dd/MM/yyyy"),
                                                               "",
                                                               _cl.Current_DATE("hh:mm:ss"),
                                                               "",
                                                               (int)Code.StaticVariable.approveCase.ChuaDuyet + "",
                                                               this._function,
                                                               this._ID,
                                                               DataTableToString(_tableValue));
                                //luu vet nguoi thuc hien
                                _code._services.Update_Last_Change(_formName, this._ID, Code.StaticVariable.userID);
                                MessageBox.Show(msg, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                                this.Close();
                            }
                            else
                                this.Close();
                        }
                        catch (Exception ex)
                        {
                            this._tableValue = new DataTable("noname");
                            MessageBox.Show(ex.Message, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                        }
                        break;
                    default:
                        break;
                }

            }
        }

        private bool Check_DieuKien()
        {
            // check 1 vong, xem có textbox truy vấn nào bắt buộc điền mà chưa điền thì báo lỗi
            foreach (TextBox txt in this._listTextbox_Truyvan)
            {
                if (txt.Name.Contains("_mandatory") && txt.Text.Trim().Length == 0)
                {
                    MessageBox.Show(txt.Tag.ToString() + Code.StaticVariable.messeseboxKoDcBoTrong, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                    txt.Focus();
                    return false;
                }
            }
            // check 1 vong, xem có textbox nào bắt buộc điền mà chưa điền thì báo lỗi
            foreach (TextBox txt in this._listTextbox)
            {
                if (txt.Name.Contains("_mandatory") && txt.Text.Trim().Length == 0)
                {
                    MessageBox.Show(txt.Tag.ToString() + Code.StaticVariable.messeseboxKoDcBoTrong, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                    txt.Focus();
                    return false;
                }
            }

            // check 1 vong, xem có DatetimePicker nào bắt buộc điền mà chưa điền thì báo lỗi
            foreach (DateTimePicker dtp in this._listDatetimepicker)
            {
                if (dtp.Name.Contains("_mandatory") && dtp.Text == "")
                {
                    MessageBox.Show(dtp.Tag.ToString() + Code.StaticVariable.messeseboxKoDcBoTrong, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                    dtp.Focus();
                    return false;
                }
            }

            // check xem có trường nào trùng giá trị không
            foreach (TextBox txt in this._listTextbox)
            {
                if (txt.Name.Contains("_defparam") && (this._function == Code.StaticVariable.function_AddNew))
                {
                    if (_code._services.Check_TrungGiaTri(txt.Text, this._NameofTable, txt.AccessibleDescription))
                    {
                        MessageBox.Show(txt.Tag.ToString() + Code.StaticVariable.messeseboxTrungGiaTri, Code.StaticVariable.messeseboxLuuY, MessageBoxButtons.OK);
                        txt.Focus();
                        return false;
                    }
                }
            }
            return true;
        }

        private void ShowData()
        {
            switch (this._function)
            {
                case "View":
                    //this.gbTT.Enabled = false;
                    this.btnFunction.Visible = false;
                    break;
                case "Edit":
                    this.btnFunction.Text = "Cập nhập";
                    break;
                default:
                    break;
            }

            // lấy dữ liệu theo ID
            _oldtableData = _code._services.GetDatatable_BySQL("select * from " + this._formName + " where " + this._ID_ColumnName + " like '" + this._ID + "'");
            if (_oldtableData.Rows.Count > 0)
            {
                // so sánh các trường giá trị để trả ra kết quả
                // textbox
                foreach (TextBox item in this._listTextbox)
                {
                    foreach (DataColumn column in _oldtableData.Columns)
                    {
                        if (item.AccessibleDescription == column.ColumnName)
                        {
                            item.Text = _oldtableData.Rows[0][column].ToString();
                            // kiem tra neu la Numberic + > 1000 thi format lai cho dep
                            if (item.AccessibleName.Length != 0)
                            {
                                item.Text = this._cl.NumberFormat(item.Text);
                            }
                        }

                        // Disable Truong ID
                        if (item.AccessibleDescription == this._ID_ColumnName && this._function == "Edit")
                        {
                            item.Enabled = false;
                        }
                    }  
                }

                // textbox truy van
                foreach (TextBox item in this._listTextbox_Truyvan)
                {
                    foreach (DataColumn column in _oldtableData.Columns)
                    {
                        if (item.AccessibleDescription == column.ColumnName)
                        {
                            _textbox_Truyvan_setData(item, _oldtableData.Rows[0][column.ColumnName].ToString());
                        }
                    }
                    
                }

                // combobox
                foreach (ComboBox item in this._listCombobox)
                {
                    foreach (DataColumn column in _oldtableData.Columns)
                    {
                        this.Check_Combobox_ByID(item, column, _oldtableData);
                    }
                }

                // datetimepicker
                foreach (DateTimePicker item in this._listDatetimepicker)
                {
                    foreach (DataColumn column in _oldtableData.Columns)
                    {
                        if (item.AccessibleDescription == column.ColumnName)
                        {
                            //DATNT: them dk khac NULL chong loi
                            if (_oldtableData.Rows[0][column].ToString().Length != 0)
                            {
                                //gán giá trị vào datetime picker
                                item.Value = Convert.ToDateTime(_oldtableData.Rows[0][column].ToString());
                            }
                        }
                    }
                }

                // Show picture box
                foreach (DataColumn column in _oldtableData.Columns)
                {
                    if (column.ColumnName.Contains("_IMAGE"))
                    {
                        if (_oldtableData.Rows[0][column].ToString().Length != 0)
                        {
                            Image img = this.Base64ToImage(_oldtableData.Rows[0][column].ToString());
                            byte[] newBytes = Convert.FromBase64String(_oldtableData.Rows[0][column].ToString());
                            foreach (PictureBox ptb in this._listPictureBox)
                            {
                                if (ptb.AccessibleDescription == column.ColumnName)
                                {
                                    ptb.Image = img;
                                }
                            }
                        }
                    }
                }
            }
        }

        public Image Base64ToImage(string base64String)
        {
            // Convert base 64 string to byte[]
            byte[] imageBytes = Convert.FromBase64String(base64String);
            MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
            ms.Write(imageBytes, 0, imageBytes.Length);
            return Image.FromStream(ms, true);//Exception occurs here

        }

        public byte[] ImageToByte(Image img)
        {
            ImageConverter converter = new ImageConverter();
            return (byte[])converter.ConvertTo(img, typeof(byte[]));
        }

        public string DataTableToString(DataTable dt)
        {
            string _str = "";
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                    _str += dt.Rows[0][i].ToString() + ".";

                _str = _str.Substring(0, _str.Length - 1);
            }

            return _str;
        }

        public bool Compare2Table(DataTable _oldTable, DataTable _newTable)
        {
            if (_oldTable.Rows.Count > 0 && _newTable.Rows.Count > 0)
            {
                foreach (DataColumn col in _newTable.Columns)
                {
                    string _old = _oldTable.Rows[0][col.ColumnName].ToString();
                    string _new = _newTable.Rows[0][col.ColumnName].ToString();
                    if (col.ColumnName.Contains("_IMAGE") && _new.Length == 0)
                        continue;
                    if (_old != _new)
                        return false;
                }
            }
            else
                return false;
            return true;
        }

        private void Check_Combobox_ByID(ComboBox combobox, DataColumn columnData, DataTable tableData)
        {
            if (combobox.AccessibleDescription == columnData.ColumnName)
            {
                // nếu combobox lấy theo ID từ 1 bảng khác thì kiểm tra
                if (combobox.AccessibleName != "" && combobox.AccessibleName.Contains("ALLCODE") == true)
                {
                    // ta đã có ID theo dữ liệu truyền vào ,  Có combobox gồm tên trường nhưng ko có ID . h cần so sánh để hiện ra tên trường theo ID
                    DataTable _tableAllCode = _code._services.GetDatatable_BySQL(combobox.AccessibleName);
                    foreach (DataRow row in _tableAllCode.Rows)
                    {
                        if (row["value"].ToString() == tableData.Rows[0][columnData].ToString())
                        {
                            for (int i = 0; i < combobox.Items.Count; i++)
                            {
                                if (combobox.Items[i].ToString() == row["display"].ToString())
                                {
                                    combobox.SelectedIndex = i;
                                    return;
                                }
                            }
                        }
                    }
                }
                else
                {
                    combobox.Text = tableData.Rows[0][columnData].ToString();
                }
            }
        }

        public bool CheckSLTraiPhieu()
        {
            //neu la form BSC_TBL_SOTRAICHU thi check so luong TP cua so so voi sl TP phat hanh
            if (_formName == "BSC_TBL_SOTRAICHU")
            {
                //get matp
                string matp = "";
                double sltraiphieu = 0; //sl trai phieu hien dang nhap
                double sltpph = 0; //sl tp duoc phat hanh boi tcph
                double sltpdamua = 0; //sltp da duoc mua boi cac trai chu
                for (int i = 0; i < _listTextbox_Truyvan.Count; i++)
                {
                    TextBox _txt_TenTP = _listTextbox_Truyvan[i];
                    if (_txt_TenTP.AccessibleDescription == "MATP")
                    {
                        matp = _txt_TenTP.Name;
                        break;
                    }
                }

                for (int i = 0; i < _listTextbox.Count; i++)
                {
                    TextBox _txt = _listTextbox[i];
                    if (_txt.AccessibleDescription == "SLPHOTHONG" || _txt.AccessibleDescription == "SLHANCHE" || _txt.AccessibleDescription == "SLCAMCO")
                    {
                        sltraiphieu += Convert.ToDouble(_txt.Text);
                        continue;
                    }
                }

                sltpph = _cl._services.Get_SL_TPPH(matp);
                if (this._function == Code.StaticVariable.function_Edit)
                    sltpdamua = _cl._services.Get_ALL_TP_Where(matp, _ID);
                else
                    sltpdamua = _cl._services.Get_ALL_TP(matp);
                if (sltraiphieu + sltpdamua > sltpph)
                    return false;
                return true;
            }
            return true;
        }


        #endregion

    }
}
